"use strict";
// 7、tuple 元组
// 元组（Tuple）是一种特殊的数组类型，可以固定数量的元素，并且
// 每个元素的类型是已知的且可以不同，元组用于精确描述一组值的类
// 型，?表示可选元素
let data;
let arrdata;
data = ['name', 666];
arrdata = ['name'];
let arrTest; //表示后面可以写任意个字符串数据元素
arrTest = [1, 'a', 'b', 'c'];
// 8、enum   // enum是一个关键词，和es6的class类一样
// 枚举(enum)可以定义一组命名常亮，他能增强代码的可读性，也能让代码更好维护
// 案例：JS常规写法
function walkJs(data) {
    if (data == 'up') {
        console.log('向【上】走了');
    }
    else if (data == 'down') {
        console.log('向【下】走了');
    }
    else if (data == 'left') {
        console.log('向【左】走了');
    }
    else if (data == 'right') {
        console.log('向【右】走了');
    }
    else {
        console.log('你往哪走了？？？');
    }
}
walkJs('up');
walkJs('left');
walkJs('right');
walkJs('hskjhks');
// 这种写法弊端：
//    1、如果逻辑较多会导致维护性较差，假人括号里判断的是数字1、2或者其他的字符等等，逻辑不清晰
//    2、如果传入的参数写错了，会没有提示报警，那么就会执行错误的逻辑。
//案例  TS写法 
var Direction;
(function (Direction) {
    Direction[Direction["Up"] = 0] = "Up";
    Direction[Direction["Down"] = 1] = "Down";
    Direction[Direction["Left"] = 2] = "Left";
    Direction[Direction["Right"] = 3] = "Right";
})(Direction || (Direction = {}));
function walkTs(data) {
    if (data == Direction.Up) {
        console.log('向【上】走了');
    }
    else if (data == Direction.Down) {
        console.log('向【下】走了');
    }
    else if (data == Direction.Left) {
        console.log('向【左】走了');
    }
    else if (data == Direction.Right) {
        console.log('向【右】走了');
    }
    else {
        console.log('你往哪走了？？？');
    }
}
// walkTs('ass')  //报错
walkTs(Direction.Down);
walkTs(Direction.Left);
walkTs(Direction.Down);
// 详解：
// 一、数字枚举
// 数字枚举是一种最常见的枚举类型，其成员的值会自动递增，且数字枚
// 举还具备反向映射的特点，在下面代码的打印中，不难发现:可以通过
// 值来获取对应的枚举成员名称
var TestEnum;
(function (TestEnum) {
    TestEnum[TestEnum["Up"] = 0] = "Up";
    TestEnum[TestEnum["Down"] = 1] = "Down";
    TestEnum[TestEnum["Left"] = 2] = "Left";
    TestEnum[TestEnum["Right"] = 3] = "Right";
    // Up = 111,  数字枚举的数字可以自定义
    // Down = 222,
    // Left = 333,
    // Right = 444
})(TestEnum || (TestEnum = {}));
console.log(TestEnum.Up); //打印的是：0
//1、Up,Down,Left,Right这些可不是对象的简写形式
console.log('TestEnum', TestEnum);
// 打印的是 {0:'Up',1:'Down',2:'Left',3:'Right',Up:0,Down：1,Left:2,Right:3}
// up:0,Down：1,Left:2,Right:3  数字枚举的递增性
// 0:'Up',1:'Down',2:'Left',3:'Right'  反向映射
// 2、enum定义的变量是只读的属性
// TestEnum.Up = 999  //报错
//二、 字符串枚举
// 枚举成员的值是字符串
var StrEnum;
(function (StrEnum) {
    StrEnum["up"] = "up";
    StrEnum["down"] = "down";
    StrEnum["left"] = "left";
    StrEnum["right"] = "right";
})(StrEnum || (StrEnum = {}));
// 字符串枚举会丢失其反向映射的值
console.log('StrEnum', StrEnum); //打印的是：{up: 'up', down: 'down', left: 'left', right: 'right'}
console.log('ConstEnum', 0 /* ConstEnum.Up */);
// 从编程的角度是没啥区别的，最主要的差别是在index.js文件里不会显示ConstEnum这个方法了，性能提升
